<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Streaming SIMD Extensions</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Streaming_SIMD_Extensions"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Streaming_SIMD_Extensions rootpage-Streaming_SIMD_Extensions skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Streaming SIMD Extensions</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">
<p><span class="lang-en" lang="en"><i><b>Streaming SIMD Extensions</b></i></span>, généralement <a href="Abr%C3%A9viation" title="Abréviation">abrégé</a> <b>SSE</b>, est un <a href="Jeu_d'instructions" title="Jeu d'instructions">jeu d'instructions</a> pour <a href="Microprocesseur" title="Microprocesseur">microprocesseurs</a> <a href="X86" title="X86">x86</a> implémenté pour la première fois par <a href="Intel" title="Intel">Intel</a> en <a href="1999_en_informatique" title="1999 en informatique">1999</a>, sur le <a href="Pentium_III" title="Pentium III">Pentium <abbr class="abbr" title="3"><span class="romain" style="text-transform:uppercase">III</span></abbr></a>, en réponse au <a href="3DNow!" title="3DNow!">3DNow!</a> d'<a href="Advanced_Micro_Devices" title="Advanced Micro Devices">AMD</a> apparu 1 an plus tôt. Le fonctionnement est de type <a href="Single_Instruction_Multiple_Data" class="mw-redirect" title="Single Instruction Multiple Data">SIMD</a> et ajoute 70 <a href="Instruction-machine" class="mw-redirect" title="Instruction-machine">instructions-machine</a> supplémentaires.
</p><p>Il a été d'abord dévoilé sous le nom KNI signifiant « <span class="lang-en" lang="en"><i>Katmai New Instructions</i></span> » (Nouvelles instructions Katmai en <a href="Anglais" title="Anglais">anglais</a>, Katmai étant le nom de code pour la première version du cœur du Pentium <abbr class="abbr" title="3"><span class="romain" style="text-transform:uppercase">III</span></abbr>). Pendant le projet Katmai, Intel désirait le distinguer de ses précédentes lignes de produit et particulièrement de son produit phare, le Pentium <abbr class="abbr" title="2"><span class="romain" style="text-transform:uppercase">II</span></abbr>. AMD ajouta le support d'instructions SSE avec ses processeurs <a href="Athlon_XP" class="mw-redirect" title="Athlon XP">Athlon XP</a>. Il fut ultérieurement renommé ISSE, ce qui signifie « <span class="lang-en" lang="en"><i>Intel Streaming SIMD Extensions</i></span> » (Extensions pour flux SIMD d'Intel en anglais), puis SSE.
</p><p>Les SIMD et <a href="Jeu_d'instructions_MMX" title="Jeu d'instructions MMX">MMX</a> <a href="IA-32" class="mw-redirect" title="IA-32">IA-32</a> se sont globalement révélés décevants. Le MMX avait deux problèmes principaux : il réutilisait des registres à virgule flottante <a href="X87" title="X87">x87</a> existants, rendant le processeur incapable de fonctionner simultanément en <a href="Virgule_flottante" title="Virgule flottante">virgule flottante</a> et en donnée SIMD et ne fonctionnait que sur les entiers.
</p>
<div class="mw-heading mw-heading2"><h2 id="Registres">Registres</h2></div>
<p>Le SSE a originellement ajouté huit nouveaux registres 128 bits nommés XMM0 à XMM7. Les extensions <a href="X64" title="X64">x64</a> d'Intel et AMD ajoutent huit nouveaux registres de XMM8 à XMM15. Il y a également un nouveau registre 32 bits de contrôle/statut nommé MXCSR.
</p><p>Chaque registre compacte ensemble quatre nombres flottants simple précision 32 bits. Les opérations SIMD entières peuvent toujours être effectuées par les huit registres 64 bits MMX.
</p>
<div class="mw-heading mw-heading2"><h2 id="Instructions_SSE">Instructions SSE</h2></div>
<p>Le SSE a à la fois introduit des instructions scalaires et de virgule flottante compactée.
</p>
<div class="mw-heading mw-heading3"><h3 id="Instructions_à_virgule_flottante"><span id="Instructions_.C3.A0_virgule_flottante"></span>Instructions à virgule flottante</h3></div>
<ul><li>Déplacement de donnée de mémoire à registre / Registre à mémoire / Registre à registre.
<ul><li>Scalaire - MOVSS</li>
<li>Compacté - MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS</li></ul></li>
<li>Arithmétique
<ul><li>Scalaire - ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS</li>
<li>Compacté - ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS</li></ul></li>
<li>Comparaison
<ul><li>Scalaire - CMPSS, COMISS, UCOMISS</li>
<li>Compacté - CMPPS</li></ul></li>
<li>Mélange de données et dépaquetage.
<ul><li>Compacté - SHUFPS, UNPCKHPS, UNPCKLPS</li></ul></li>
<li><a href="Conversion_de_type" title="Conversion de type">Conversion de type</a> de donnée
<ul><li>Scalaire - CVTSI2SS, CVTSS2SI, CVTTSS2SI</li>
<li>Compacté - CVTPI2PS, CVTPS2PI, CVTTPS2PI</li></ul></li>
<li>Opération logiques bit à bit
<ul><li>Compacté - ANDPS, ORPS, XORPS, ANDNPS</li></ul></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Instructions_entières"><span id="Instructions_enti.C3.A8res"></span>Instructions entières</h3></div>
<ul><li>Arithmétiques
<ul><li>PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW</li></ul></li>
<li>Mouvement de données
<ul><li>PEXTRW, PINSRW</li></ul></li>
<li>Autres
<ul><li>PMOVMSKB, PSHUFW</li></ul></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Autres_instructions">Autres instructions</h3></div>
<ul><li>Gestion du registre MXCSR
<ul><li>LDMXCSR, STMXCSR</li></ul></li>
<li>Gestion de la mémoire et du cache
<ul><li>MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE</li></ul></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Exemple">Exemple</h2></div>
<p>Le simple exemple suivant montre les avantages de l'utilisation du SSE.
</p><p>Les instructions SSE1 fonctionnent avec des nombres flottants simple précision, c'est-à-dire stockés sur 4 octets. Une variable de vecteur 4 dimensions adaptée aux registres est donc constituée de 16 octets. Si les données sont alignées sur 128 bits, on peut les lire avec l'instruction <i>movaps</i>, sinon si on ne peut pas le garantir, on doit utiliser <i>movups</i>. Sinon, on obtient une erreur à l'exécution.
</p><p>Pour l'opération d'addition vectorielle le <a href="X87" title="X87">x87</a> requiert quatre instructions d'addition flottantes pour additionner entre eux deux vecteurs de dimension 4 à simple précision.
</p>
<pre>vec_res.x = v1.x + v2.x;<br>
vec_res.y = v1.y + v2.y;<br>
vec_res.z = v1.z + v2.z;<br>
vec_res.w = v1.w + v2.w;<br>
</pre>
<p>Cela correspond à quatre instructions <code>FADD</code> du x87 en <a href="Code_objet" title="Code objet">code objet</a>. Alors que le <a href="Pseudo-code" title="Pseudo-code">pseudo-code</a> suivant montre qu'une seule instruction 128 bit <span class="lang-en" lang="en"><i>‘packed-add’</i></span> (addition compacte) peut remplacer les quatre instructions d'addition scalaire. On suppose ici que les données sont alignées en mémoire sur 128 bits.
</p>
<pre>movaps xmm0,adresse-de-v1 ;xmm0 = v1.w | v1.z | v1.y | v1.x
addps xmm0,adresse-de-v2 ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x
movaps adresse-du-vec_res,xmm0
</pre>
<p>C'est néanmoins en utilisant au maximum les registres pour stocker les valeurs lors d'opération complexes que l'on obtient vraiment un gain en vitesse.
</p>
<div class="mw-heading mw-heading2"><h2 id="Normaliser_un_vecteur">Normaliser un vecteur</h2></div>
<p>Supposons que le registre xmm0 contienne un vecteur à trois dimensions à normaliser (la <abbr class="abbr" title="Quatrième">4<sup>e</sup></abbr> composante étant à zéro). En utilisant temporairement les registres xmm6 et xmm7, on peut normaliser le vecteur ainsi :
</p>
<pre> //Entrée: xmm0 contient un vecteur à normaliser
movaps xmm6, xmm0 //effectue une copie du vecteur dans xmm6
mulps xmm0, xmm0 //carré de chaque composante
//mix1
movaps xmm7, xmm0
shufps xmm7, xmm7, $4e
addps xmm0, xmm7 //additionne les composantes mélangées
//mix2
movaps xmm7, xmm0
shufps xmm7, xmm7, $11
addps xmm0, xmm7 //additionne les composantes mélangées
//1/sqrt
rsqrtps xmm0, xmm0 //inverse de la racine carrée (= longueur)
mulps xmm0, xmm6 //que multiplie le vecteur initial
//Sortie: xmm0 contient le vecteur normalisé
</pre>
<div class="mw-heading mw-heading2"><h2 id="Produit_vectoriel">Produit vectoriel</h2></div>
<p>Supposons que les variables vS1 et vS2 contiennent deux vecteurs définissant un plan, ayant 3 composantes et 1 composante non utilisée. Le <a href="Produit_vectoriel" title="Produit vectoriel">produit vectoriel</a> permet d'obtenir un vecteur normal, c'est-à-dire perpendiculaire à ce plan. En utilisant temporairement les registres xmm6 et xmm7, on peut calculer le produit vectoriel et le stocker dans xmm0 comme cela :
</p>
<pre> movups xmm6, vS1 //le U signifie qu'on ne suppose pas que les données sont alignées à 128 bits
shufps xmm6, xmm6, 9 //= 1 + 8, c'est-à-dire une rotation des 3 composantes
movups xmm7, vS2
shufps xmm7, xmm7, 18 //= 2 + 16, c'est-à-dire une rotation dans l'autre sens
movaps xmm0,xmm6 //premier produit pour chaque composante
mulps xmm0,xmm7
movups xmm6, vS1
shufps xmm6, xmm6, 18
movups xmm7, vS2
shufps xmm7, xmm7, 9
mulps xmm7,xmm6 //deuxième produit retranché pour chaque composante
subps xmm0,xmm7
//Sortie: xmm0 contient le produit vectoriel de vS1 et vS2
</pre>
<div class="mw-heading mw-heading2"><h2 id="Évolutions"><span id=".C3.89volutions"></span>Évolutions</h2></div>
<ul><li>Le <a href="Streaming_SIMD_Extension_2" title="Streaming SIMD Extension 2">SSE2</a> créé pour le <a href="Pentium_4" title="Pentium 4">Pentium 4</a> ajoute des instructions flottantes double précision (64 bits) et étend les instructions MMX avec des opérations sur les registres <a href="#Registres">XMM</a> 128 bits.</li>
<li>Le <a href="SSE3" title="SSE3">SSE3</a> sur le Pentium <abbr class="abbr" title="4"><span class="romain" style="text-transform:uppercase">IV</span></abbr> Prescott, ajoute des instructions mathématiques orientées <a href="Digital_signal_processor" class="mw-redirect" title="Digital signal processor">DSP</a> et quelques instructions de gestion de processus.</li>
<li>Le <a href="SSSE3" title="SSSE3">SSSE3</a> ajoute 16 nouveaux <span class="lang-en" lang="en"><i><a href="Langage_machine#Opcode" title="Langage machine">opcodes</a></i></span> qui incluent la permutation des octets dans un mot, la multiplication des nombres à virgule fixe 16 bits avec un arrondissement correct et des instructions d'accumulation dans un mot. SSSE3 est souvent confondu avec SSE4 car ce terme a été utilisé pendant la phase de développement de la microarchitecture.</li>
<li>Le <a href="SSE4" title="SSE4">SSE4</a> est une autre avancée majeure, ajoutant une instruction de produit scalaire, de nombreuses instructions d'additions entières, une instruction <code>popcnt</code> et d'autres instructions. SSE4 arrête le support des registres MMX. Le SSE4 est supporté par la version 'Penryn' de la microarchitecture <a href="Core_2" class="mw-redirect" title="Core 2">Core 2</a><sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup><sup class="reference cite_virgule">,</sup><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>.</li>
<li>Le <a href="SSE5" title="SSE5">SSE5</a> prévu initialement pour mi-<time class="nowrap date-lien" datetime="2007-08" data-sort-value="2007-08"><a href="Ao%C3%BBt_2007" title="Août 2007">août</a> <a href="2007_en_informatique" title="2007 en informatique">2007</a></time> par AMD et implémenté dans la <a href="Bulldozer_(microarchitecture)" title="Bulldozer (microarchitecture)">microarchitecture Bulldozer</a> en <time class="nowrap date-lien" datetime="2011-10" data-sort-value="2011-10"><a href="Octobre_2011" title="Octobre 2011">octobre</a> <a href="2011_en_informatique" title="2011 en informatique">2011</a></time>, permet, comme dans les processeurs <a href="Reduced_instruction_set_computer" class="mw-redirect" title="Reduced instruction set computer">RISC</a>, de préciser dans l'instruction un troisième registre destination, ce qui permet d'économiser un bon nombre d'instructions et devrait intrinsèquement accélérer les calculs. Auparavant, il fallait d'abord copier le contenu du registre destination dans un nouveau registre afin de ne pas détruire les informations précédentes<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup class="reference cite_virgule">,</sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Notes_et_références"><span id="Notes_et_r.C3.A9f.C3.A9rences"></span>Notes et références</h2></div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external autonumber" href="https://arstechnica.com/news.ars/post/20070328-intel-spills-beans-on-core-2-successor-sse4-faster-virtualization-bigger-caches.html">[1]</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external autonumber" href="http://www.intel.com/technology/architecture-silicon/sse4-instructions/index.htm">[2]</a></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="https://www.theregister.co.uk/2007/08/30/amd_sse5/"><span class="lang-en" lang="en"><i>AMD plots single thread boost with x86 extensions</i></span></a> sur theregister.co.uk</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://developer.amd.com/SSE5/Pages/default.aspx"><span class="lang-en" lang="en"><i>128-Bit SSE5 Instruction Set</i></span></a> sur developer.AMD.com</span>
</li>
</ol></div>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Articles_connexes">Articles connexes</h3></div>
<ul><li><a href="Jeu_d'instructions_x86" title="Jeu d'instructions x86">Jeu d'instructions x86</a></li>
<li><a href="Jeu_d'instructions_MMX" title="Jeu d'instructions MMX">MMX</a></li>
<li><a href="3DNow!" title="3DNow!">3DNow!</a></li>
<li><a href="Streaming_SIMD_Extension_2" title="Streaming SIMD Extension 2">SSE2</a>, <a href="SSE3" title="SSE3">SSE3</a>, <a href="SSSE3" title="SSSE3">SSSE3</a>, <a href="SSE4" title="SSE4">SSE4</a>, <a href="SSE5" title="SSE5">SSE5</a></li></ul>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l’informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2025-02-12" href="https://fr.wikipedia.org/wiki/?title=Streaming_SIMD_Extensions&oldid=222942253">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>